import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import cv2
import numpy as np
#função que converte a imagem para nÃveis de cinza, de acordo com Y = 0.30 R + 0.55 G + 0.15 B.
def rgbTogray(rgb):
return np.dot(rgb[...,:3], [0.3, 0.55, 0.15])
# carrega imagem pessoal de qualidade 1024 x 1024
img = mpimg.imread('foto_lindeberg.jpeg')
#converte a image para nÃveis de cinza
img_gray = rgbTogray(img)
# calcula a fft da imagem
f = np.fft.fft2(img_gray)
# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)
#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))
# define o tamanho da imagem
plt.subplots(figsize=(15,15))
# mostra a imagem orinal em nÃvel de cinza
plt.subplot(121),plt.imshow(img_gray, cmap = 'gray')
plt.title('Imagem original em nÃveis de cinza'), plt.xticks([]), plt.yticks([])
# mostra o espetro de frequência da imagem
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em nÃveis de cinza '), plt.xticks([]), plt.yticks([])
kernel1= np.ones((3, 3), np.float32) / 9
kernel2= np.ones((5, 5), np.float32) / 25
kernel3= np.ones((9, 9), np.float32) / 81
#convolução com o kernel1 (passa-baixa)
img_gray_filtered = cv2.filter2D(img_gray, -1, kernel1)
# calcula a fft da imagem
f = np.fft.fft2(img_gray_filtered)
# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)
#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))
# define o tamanho da imagem
plt.subplots(figsize=(15,15))
# mostra a imagem orinal em nÃvel de cinza
plt.subplot(221),plt.imshow(img_gray, cmap = 'gray')
plt.title('Imagem original em nÃveis de cinza'), plt.xticks([]), plt.yticks([])
# mostra o espetro de frequência da imagem
plt.subplot(222),plt.imshow(img_gray_filtered, cmap = 'gray')
plt.title('Imagem original em nÃveis de cinza borrada - kernel1'), plt.xticks([]), plt.yticks([])
# mostra o espetro de frequência da imagem
plt.subplot(223),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em nÃveis de cinza'), plt.xticks([]), plt.yticks([])
# calcula a fft da imagem barrada no domÃnio de fourier
f = np.fft.fft2(img_gray_filtered)
# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)
#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))
# mostra o espetro de frequência da imagem
plt.subplot(224),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em nÃveis de cinza borrada - kernel1'), plt.xticks([]), plt.yticks([])
#convolução com o kernel2 (passa-baixa)
img_gray_filtered = cv2.filter2D(img_gray, -1, kernel2)
# calcula a fft da imagem
f = np.fft.fft2(img_gray_filtered)
# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)
#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))
# define o tamanho da imagem
plt.subplots(figsize=(15,15))
# mostra a imagem orinal em nÃvel de cinza
plt.subplot(221),plt.imshow(img_gray, cmap = 'gray')
plt.title('Imagem original em nÃveis de cinza'), plt.xticks([]), plt.yticks([])
# mostra o espetro de frequência da imagem
plt.subplot(222),plt.imshow(img_gray_filtered, cmap = 'gray')
plt.title('Imagem original em nÃveis de cinza borrada - kernel2'), plt.xticks([]), plt.yticks([])
# mostra o espetro de frequência da imagem
plt.subplot(223),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em nÃveis de cinza'), plt.xticks([]), plt.yticks([])
# calcula a fft da imagem barrada no domÃnio de fourier
f = np.fft.fft2(img_gray_filtered)
# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)
#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))
# mostra o espetro de frequência da imagem
plt.subplot(224),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em nÃveis de cinza borrada - kernel2'), plt.xticks([]), plt.yticks([])
#convolução com o kernel3 (passa-baixa)
img_gray_filtered = cv2.filter2D(img_gray, -1, kernel3)
# calcula a fft da imagem
f = np.fft.fft2(img_gray_filtered)
# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)
#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))
# define o tamanho da imagem
plt.subplots(figsize=(15,15))
# mostra a imagem orinal em nÃvel de cinza
plt.subplot(221),plt.imshow(img_gray, cmap = 'gray')
plt.title('Imagem original em nÃveis de cinza'), plt.xticks([]), plt.yticks([])
# mostra o espetro de frequência da imagem
plt.subplot(222),plt.imshow(img_gray_filtered, cmap = 'gray')
plt.title('Imagem original em nÃveis de cinza borrada - kernel3'), plt.xticks([]), plt.yticks([])
# mostra o espetro de frequência da imagem
plt.subplot(223),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em nÃveis de cinza'), plt.xticks([]), plt.yticks([])
# calcula a fft da imagem barrada no domÃnio de fourier
f = np.fft.fft2(img_gray_filtered)
# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)
#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))
# mostra o espetro de frequência da imagem
plt.subplot(224),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em nÃveis de cinza borrada - kernel3'), plt.xticks([]), plt.yticks([])
#Borrar a imagem no domÃnio de Fourier (filtros iguais ao da convolução);
from scipy import fftpack
kernel = kernel1
# número total de padding
sz = (img.shape[0] - kernel.shape[0], img.shape[1] - kernel.shape[1])
# adiciona padding ao kernel
kernel = np.pad(kernel, (((sz[0]+1)//2, sz[0]//2), ((sz[1]+1)//2, sz[1]//2)), 'constant')
# realiza o shift no kernel
kernel = fftpack.ifftshift(kernel)
# calcula a ffft da image e do kernel e realiza o produto. Depois calcula a fft inversa e considera apenas a parte real
img_gray_filtered = np.real(fftpack.ifft2(fftpack.fft2(img_gray) * fftpack.fft2(kernel)))
# calcula a fft da imagem
f = np.fft.fft2(img_gray)
# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)
#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))
# define o tamanho da imagem
plt.subplots(figsize=(15,15))
# mostra a imagem orinal em nÃvel de cinza
plt.subplot(221),plt.imshow(img_gray, cmap = 'gray')
plt.title('Imagem original em nÃveis de cinza'), plt.xticks([]), plt.yticks([])
# mostra o espetro de frequência da imagem
plt.subplot(222),plt.imshow(img_gray_filtered, cmap = 'gray')
plt.title('Imagem original em nÃveis de cinza borrada no domÃnio de Fourier (kernel1)'), plt.xticks([]), plt.yticks([])
# mostra o espetro de frequência da imagem
plt.subplot(223),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em nÃveis de cinza'), plt.xticks([]), plt.yticks([])
# calcula a fft da imagem barrada no domÃnio de fourier
f = np.fft.fft2(img_gray_filtered)
# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)
#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))
# mostra o espetro de frequência da imagem
plt.subplot(224),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em nÃveis de cinza borrada no domÃnio de Fourier (kernel1)'), plt.xticks([]), plt.yticks([])
kernel = kernel2
# número total de padding
sz = (img.shape[0] - kernel.shape[0], img.shape[1] - kernel.shape[1])
# adiciona padding ao kernel
kernel = np.pad(kernel, (((sz[0]+1)//2, sz[0]//2), ((sz[1]+1)//2, sz[1]//2)), 'constant')
# realiza o shift no kernel
kernel = fftpack.ifftshift(kernel)
# calcula a ffft da image e do kernel e realiza o produto. Depois calcula a fft inversa e considera apenas a parte real
img_gray_filtered = np.real(fftpack.ifft2(fftpack.fft2(img_gray) * fftpack.fft2(kernel)))
# calcula a fft da imagem
f = np.fft.fft2(img_gray)
# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)
#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))
# define o tamanho da imagem
plt.subplots(figsize=(15,15))
# mostra a imagem orinal em nÃvel de cinza
plt.subplot(221),plt.imshow(img_gray, cmap = 'gray')
plt.title('Imagem original em nÃveis de cinza'), plt.xticks([]), plt.yticks([])
# mostra o espetro de frequência da imagem
plt.subplot(222),plt.imshow(img_gray_filtered, cmap = 'gray')
plt.title('Imagem original em nÃveis de cinza borrada no domÃnio de Fourier (kernel2)'), plt.xticks([]), plt.yticks([])
# mostra o espetro de frequência da imagem
plt.subplot(223),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em nÃveis de cinza'), plt.xticks([]), plt.yticks([])
# calcula a fft da imagem barrada no domÃnio de fourier
f = np.fft.fft2(img_gray_filtered)
# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)
#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))
# mostra o espetro de frequência da imagem
plt.subplot(224),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em nÃveis de cinza borrada no domÃnio de Fourier (kernel2)'), plt.xticks([]), plt.yticks([])
kernel = kernel3
# número total de padding
sz = (img.shape[0] - kernel.shape[0], img.shape[1] - kernel.shape[1])
# adiciona padding ao kernel
kernel = np.pad(kernel, (((sz[0]+1)//2, sz[0]//2), ((sz[1]+1)//2, sz[1]//2)), 'constant')
# realiza o shift no kernel
kernel = fftpack.ifftshift(kernel)
# calcula a ffft da image e do kernel e realiza o produto. Depois calcula a fft inversa e considera apenas a parte real
img_gray_filtered = np.real(fftpack.ifft2(fftpack.fft2(img_gray) * fftpack.fft2(kernel)))
# calcula a fft da imagem
f = np.fft.fft2(img_gray)
# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)
#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))
# define o tamanho da imagem
plt.subplots(figsize=(15,15))
# mostra a imagem orinal em nÃvel de cinza
plt.subplot(221),plt.imshow(img_gray, cmap = 'gray')
plt.title('Imagem original em nÃveis de cinza'), plt.xticks([]), plt.yticks([])
# mostra o espetro de frequência da imagem
plt.subplot(222),plt.imshow(img_gray_filtered, cmap = 'gray')
plt.title('Imagem original em nÃveis de cinza borrada no domÃnio de Fourier (kernel3)'), plt.xticks([]), plt.yticks([])
# mostra o espetro de frequência da imagem
plt.subplot(223),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em nÃveis de cinza'), plt.xticks([]), plt.yticks([])
# calcula a fft da imagem barrada no domÃnio de fourier
f = np.fft.fft2(img_gray_filtered)
# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)
#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))
# mostra o espetro de frequência da imagem
plt.subplot(224),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em nÃveis de cinza borrada no domÃnio de Fourier (kernel3)'), plt.xticks([]), plt.yticks([])
# Borrar a imagem no domÃnio de Fourier (filtro "ideal");
dft = cv2.dft(np.float32(img_gray),flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
rows, cols = img_gray.shape
crow,ccol = int(rows/2) , int(cols/2)
# cria uma mascara, no centro há uns e nas extremidades zeros
mask = np.zeros((rows,cols,2),np.uint8)
mask[crow-50:crow+50, ccol-50:ccol+50] = 1
# aplica a mascara e calcula a fft inversa
fshift = dft_shift*mask
f_ishift = np.fft.ifftshift(fshift)
img_back = cv2.idft(f_ishift)
img_back = cv2.magnitude(img_back[:,:,0],img_back[:,:,1])
# define o tamanho da imagem
plt.subplots(figsize=(15,15))
# mostra a image orinal em escala de cinza
plt.subplot(221),plt.imshow(img_gray, cmap = 'gray')
plt.title('Imagem original em nÃveis de cinza'), plt.xticks([]), plt.yticks([])
#mostra a imagem borrada no domÃnio de fourier
plt.subplot(222),plt.imshow(img_back, cmap = 'gray')
plt.title('Imagem borrada no domÃnio de Fourier (filtro "ideal")'), plt.xticks([]), plt.yticks([])
plt.show()
# calcula a fft da imagem original
f = np.fft.fft2(img_gray)
# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)
#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))
plt.subplots(figsize=(15,15))
# mostra o espetro de frequência da imagem
plt.subplot(223),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em nÃveis de cinza'), plt.xticks([]), plt.yticks([])
# calcula a fft da imagem barrada no domÃnio de fourier
f = np.fft.fft2(img_back)
# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)
#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))
# mostra o espetro de frequência da imagem
plt.subplot(224),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem borrada no domÃnio de Fourier (filtro "ideal")'), plt.xticks([]), plt.yticks([])
# Passa alta da imagem
#from scipy import ndimage
data = np.array(img_gray, dtype=float)
# filtro passa alta
kernel = np.array([[-1, -1, -1, -1, -1],
[-1, 1, 2, 1, -1],
[-1, 2, 4, 2, -1],
[-1, 1, 2, 1, -1],
[-1, -1, -1, -1, -1]])
# convolução com o passa-alta
highpass_5x5 = cv2.filter2D(data, -1, kernel)
plt.subplots(figsize=(15,15))
# mostra a imagem original
plt.subplot(121),plt.imshow(data, cmap = 'gray')
plt.title('Imagem original em escala de cinza'), plt.xticks([]), plt.yticks([])
# mostra a imagem filtrada pelo passa-alta
plt.subplot(122),plt.imshow(highpass_5x5, cmap = 'gray')
plt.title('Imagem filtrada pelo passa-alta'), plt.xticks([]), plt.yticks([])
plt.show()
# calcula a fft da imagem original
f = np.fft.fft2(img_gray)
# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)
#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))
plt.subplots(figsize=(15,15))
# mostra o espetro de frequência da imagem
plt.subplot(223),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em escala de cinza'), plt.xticks([]), plt.yticks([])
# calcula a fft da imagem filtrada pela passa-alta
f = np.fft.fft2(highpass_5x5)
# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)
#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))
# mostra o espetro de frequência da imagem
plt.subplot(224),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem filtrada pelo passa-alta'), plt.xticks([]), plt.yticks([])
#Realce de imagem usando o resÃduo do passa baixas (2 intensidades)
# foi utilizado o kernel1 passa-baixa
img_gray_filtered_LP = cv2.filter2D(img_gray, -1, kernel1)
# subtração entre a imagem original e o passa-baixa, resultando na imagem filtrada pelo passa-alta
img_gray_filtered_HP = img_gray - img_gray_filtered_LP
# realce na image com adição de uma percentual do passa-alta
Imagem_realce= img_gray + 0.8*img_gray_filtered_HP
plt.subplots(figsize=(15,15))
# mostra a imagem original
plt.subplot(121),plt.imshow(img_gray, cmap = 'gray')
plt.title('Imagem original em escala de cinza'), plt.xticks([]), plt.yticks([])
# mostra a imagem filtrada pelo passa-alta
plt.subplot(122),plt.imshow(Imagem_realce, cmap = 'gray')
plt.title('Imagem realçada'), plt.xticks([]), plt.yticks([])
plt.show()
# calcula a fft da imagem original
f = np.fft.fft2(img_gray)
# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)
#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))
plt.subplots(figsize=(15,15))
# mostra o espetro de frequência da imagem
plt.subplot(223),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em escala de cinza'), plt.xticks([]), plt.yticks([])
# calcula a fft da imagem filtrada pelo passa-alta
f = np.fft.fft2(Imagem_realce)
# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)
#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))
# mostra o espetro de frequência da imagem
plt.subplot(224),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem realçada'), plt.xticks([]), plt.yticks([])
#Realce de imagem usando o resÃduo do passa baixas (2 intensidades)
# foi utilizado o kernel3 passa-baixa
img_gray_filtered_LP = cv2.filter2D(img_gray, -1, kernel3)
# subtração entre a imagem original e o passa-baixa, resultando na imagem filtrada pelo passa-alta
img_gray_filtered_HP = img_gray - img_gray_filtered_LP
# realce na image com adição de uma percentual do passa-alta
Imagem_realce= img_gray + 0.8*img_gray_filtered_HP
plt.subplots(figsize=(15,15))
# mostra a imagem original
plt.subplot(121),plt.imshow(img_gray, cmap = 'gray')
plt.title('Imagem original em escala de cinza'), plt.xticks([]), plt.yticks([])
# mostra a imagem filtrada pelo passa-alta
plt.subplot(122),plt.imshow(Imagem_realce, cmap = 'gray')
plt.title('Imagem realçada'), plt.xticks([]), plt.yticks([])
plt.show()
# calcula a fft da imagem original
f = np.fft.fft2(img_gray)
# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)
#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))
plt.subplots(figsize=(15,15))
# mostra o espetro de frequência da imagem
plt.subplot(223),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em escala de cinza'), plt.xticks([]), plt.yticks([])
# calcula a fft da imagem filtrada pelo passa-alta
f = np.fft.fft2(Imagem_realce)
# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)
#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))
# mostra o espetro de frequência da imagem
plt.subplot(224),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem realçada'), plt.xticks([]), plt.yticks([])
from PIL import Image
img = img_gray
# ruÃdo gaussiano que será inserido na imagem
noise = np.random.randn(img.shape[0], img.shape[1])
img = img.astype('int16')
# imagem com ruÃdo
img_noise = img + noise * 20
img_noise = np.clip(img_noise, 0, 255)
img_noise = img_noise.astype('uint8')
# calcula a fft da imagem com ruÃdo
f = np.fft.fft2(img_noise)
# deslocar a origem para o meio da imagem
fshift = np.fft.fftshift(f)
#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))
plt.subplots(figsize=(15,15))
plt.subplot(121),plt.imshow(img_noise, cmap = 'gray')
plt.title('Imagem original com ruÃdo gaussiano'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original com ruÃdo gaussiano'), plt.xticks([]), plt.yticks([])
# Filtragem de ruÃdos gaussianos usando passa baixas
#A maior utilização dos filtros passa baixas é na remoção de ruÃdos eletrônicos, comuns em imagens de S.R.
#O grande problema desse tipo de filtro é que o efeito colateral produzido equivale
#a "desfocar" a imagem toda e, consequentemente, perder informações de detalhe.
kernel = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]])
# filtragem do ruÃdo gaussiano utiliando filtro passa-baixa (kernel3)
img_denoised = cv2.filter2D(img_noise, -1, kernel3)
# calcula a fft da imagem
f = np.fft.fft2(img_denoised)
# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)
#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))
plt.subplots(figsize=(15,15))
# imagem com ruÃdo gaussiando filtrada por filtro passa-baixa
plt.subplot(121),plt.imshow(img_denoised, cmap = 'gray')
plt.title('Imagem filtrada pelo filtro passa-baixa'), plt.xticks([]), plt.yticks([])
# espectro de imagem com ruÃdo gaussiando filtrada pelo filtro passa-baixa
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem filtrada pelo filtro passa-baixa'), plt.xticks([]), plt.yticks([])
# Filtragem de ruÃdos impulsivos usando filtro de mediana
img = img_gray
row,col = img.shape
s_vs_p = 0.7
amount = 0.05
out = np.copy(img)
# Salt mode
num_salt = np.ceil(amount * img.size * s_vs_p)
coords = [np.random.randint(0, i - 1, int(num_salt)) for i in img.shape]
out[coords] = 1
# Pepper mode
num_pepper = np.ceil(amount* img.size * (1. - s_vs_p))
coords = [np.random.randint(0, i - 1, int(num_pepper)) for i in img.shape]
out[coords] = 0
img = out
# calcula a fft da imagem
f = np.fft.fft2(img)
# deslocar a origem para o meio da imagem
fshift = np.fft.fftshift(f)
#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))
# calcula a fft da imagem
f = np.fft.fft2(img_denoised)
# deslocar a origem para o meio da imagem
fshift = np.fft.fftshift(f)
#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))
plt.subplots(figsize=(15,15))
# mostra a imagem com ruÃdos impulsivos - salt & pepper
plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Imagem com ruÃdos impulsivos - salt & pepper'), plt.xticks([]), plt.yticks([])
# motra o espectro da imagem com ruÃdos impulsivos - salt & pepper
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem com ruÃdos impulsivos - salt & pepper'), plt.xticks([]), plt.yticks([])
from scipy import ndimage
# Imagem filtrado pelo filtro de mediana. A utilização direta da função mediana foi autorizada pelo prof. Queiroz
resultado = ndimage.median_filter(img, size=3)
# calcula a fft da imagem
f = np.fft.fft2(resultado)
# deslocar a origem para o meio da imagem paa facilitar a visualização
fshift = np.fft.fftshift(f)
#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))
plt.subplots(figsize=(15,15))
# mostra a imagem após aplicação do filtro de mediana
plt.subplot(121),plt.imshow(resultado, cmap = 'gray')
plt.title('Imagem após aplicação do filtro de mediana'), plt.xticks([]), plt.yticks([])
#mostra o espectro da imagem após aplicação do filtro de mediana
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem após aplicação do filtro de mediana'), plt.xticks([]), plt.yticks([])